CTmax Data
temp_lat_plot = ctmax_data %>%
ggplot(aes(x = lat, y = collection_temp)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(size = 3) +
labs(x = "Latitude",
y = "Collection Temp. (°C)") +
theme_matt() +
theme(legend.position = "right")
ctmax_temp_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_lat_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = lat, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Latitude",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_elev_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = elevation, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species),
size = 3) +
labs(x = "Elevation (m)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ggpubr::ggarrange(temp_lat_plot, ctmax_temp_plot, ctmax_lat_plot, ctmax_elev_plot, common.legend = T, legend = "right", nrow = 2, ncol = 2, labels = "AUTO")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
filter(str_detect(species, pattern = "skisto") |
str_detect(species, pattern = "lepto") |
str_detect(species, pattern = "aglao")) %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
group_by(collection_date, species, collection_temp) %>%
summarise(mean_ctmax = mean(ctmax),
ctmax_sd = sd(ctmax),
ctmax_n = n(),
ctmax_se = ctmax_sd / sqrt(ctmax_n)) %>%
ggplot(aes(x = collection_temp, y = mean_ctmax, colour = species)) +
geom_smooth(method = "lm", se=F, linewidth = 2) +
geom_point(size = 2) +
geom_errorbar(aes(ymin = mean_ctmax - ctmax_se,
ymax = mean_ctmax + ctmax_se),
width = 0.3, linewidth = 1) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = size, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "Prosome Length (mm)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = egg_volume, colour = species)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "Egg Volume (mm^3)") +
scale_color_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
select(elevation, collection_temp) %>%
distinct() %>%
ggplot(aes(x = elevation, y = collection_temp)) +
geom_point(size = 3) +
labs(x = "Elevation (m)",
y = "Collection Temp. (°C)") +
theme_matt()

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = size, y = ctmax, colour = species)) +
facet_wrap(.~species) +
geom_point(size = 1) +
theme_matt() +
labs(x = "Length (mm)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme(legend.position = "none")

ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = size, y = fecundity, colour = species)) +
facet_wrap(.~species) +
geom_point(size = 1) +
theme_matt() +
labs(x = "Length (mm)",
y = "Fecundity (# eggs)") +
scale_colour_manual(values = skisto_cols) +
theme(legend.position = "none")

ggplot(ctmax_data, aes(x = size, y = total_egg_volume)) +
geom_smooth(method = "lm", formula = y ~ exp(x)) +
geom_point()+
labs(x = "Prosome Length (mm)",
y = "Total Egg Volume (mm^3)") +
theme_matt()

Data for just Skistodiaptomus pallidus is shown below. Point
color is arranged according to latitude.
ctmax_data %>%
filter(species == "skistodiaptomus_pallidus") %>%
mutate(site = fct_reorder(site, lat, .desc = T)) %>%
# group_by(site) %>%
# summarise(size = mean(size, na.rm = T),
# total_egg_volume = mean(total_egg_volume, na.rm = T)) %>%
ggplot(aes(x = size, y = total_egg_volume)) +
geom_smooth(method = "lm", formula = y ~ exp(x),
colour = "black") +
geom_point(aes(colour = site))+
scale_color_viridis_d(direction = 1,
option = "D") +
labs(x = "Prosome Length (mm)",
y = "Total Egg Volume (mm^3)") +
theme_matt() +
theme(legend.position = "right")

model_data = ctmax_data %>%
mutate("genus" = str_split_fixed(species, pattern = "_", n = 2)[,1],
genus = tools::toTitleCase(genus),
"doy" = yday(collection_date)) %>%
select(site, collection_date, doy, collection_temp, lat, elevation, species, genus, sample_id, fecundity, total_egg_volume, size, ctmax) %>%
filter(genus != "MH") %>%
mutate(total_egg_volume = if_else(is.na(total_egg_volume), 0, total_egg_volume),
collection_temp_sc = scale(collection_temp),
lat_sc = scale(lat),
elevation_sc = scale(elevation),
tev_sc = scale(total_egg_volume))
ctmax_overall.model = lm(data = model_data,
ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume)
drop1(ctmax_overall.model, test = "F")
## Single term deletions
##
## Model:
## ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume
## Df Sum of Sq RSS AIC F value Pr(>F)
## <none> 479.47 -0.748
## genus 2 142.564 622.03 123.847 72.4015 < 2.2e-16 ***
## collection_temp 1 94.642 574.11 86.243 96.1288 < 2.2e-16 ***
## lat 1 97.843 577.31 88.989 99.3792 < 2.2e-16 ***
## elevation 1 4.769 484.24 2.141 4.8442 0.02821 *
## total_egg_volume 1 20.167 499.64 17.605 20.4842 7.566e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#MuMIn::dredge(ctmax_temp.model)
performance::check_model(ctmax_overall.model)

summary(ctmax_overall.model)
##
## Call:
## lm(formula = ctmax ~ genus + collection_temp + lat + elevation +
## total_egg_volume, data = model_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.9057 -0.4828 0.1490 0.6352 2.4981
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.267e+01 1.102e+00 38.715 < 2e-16 ***
## genusLeptodiaptomus -2.947e+00 2.849e-01 -10.346 < 2e-16 ***
## genusSkistodiaptomus -1.488e+00 2.721e-01 -5.469 7.23e-08 ***
## collection_temp 1.573e-01 1.604e-02 9.805 < 2e-16 ***
## lat -1.987e-01 1.993e-02 -9.969 < 2e-16 ***
## elevation -2.080e-04 9.453e-05 -2.201 0.0282 *
## total_egg_volume 3.923e+01 8.668e+00 4.526 7.57e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9922 on 487 degrees of freedom
## Multiple R-squared: 0.602, Adjusted R-squared: 0.5971
## F-statistic: 122.8 on 6 and 487 DF, p-value: < 2.2e-16
emmeans::emmeans(ctmax_overall.model, specs = "genus") %>%
data.frame() %>%
mutate(genus = fct_reorder(genus, .x = emmean, .desc = T)) %>%
ggplot(aes(genus, y = emmean)) +
geom_point(size = 4) +
geom_errorbar(aes(ymin = emmean - SE, ymax = emmean + SE),
width = 0.2, linewidth = 1) +
labs(x = "") +
theme_matt() +
theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

ctmax_temp.model = lm(data = model_data,
ctmax ~ species * collection_temp)
drop1(ctmax_temp.model,
scope = ~.,
test = "F")
## Single term deletions
##
## Model:
## ctmax ~ species * collection_temp
## Df Sum of Sq RSS AIC F value Pr(>F)
## <none> 334.33 -166.87
## species 4 21.5979 355.92 -143.94 7.7683 4.513e-06 ***
## collection_temp 1 1.2044 335.53 -167.09 1.7328 0.18867
## species:collection_temp 4 8.9849 343.31 -161.76 3.2317 0.01239 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
performance::check_model(ctmax_temp.model)

sp_means = emmeans::emmeans(ctmax_temp.model, "species") %>%
data.frame() %>%
drop_na() %>%
select(species, "ctmax" = emmean)
sp_plast = emmeans::emtrends(ctmax_temp.model, "species", var = "collection_temp") %>%
data.frame() %>%
drop_na() %>%
mutate(species = fct_reorder(species, .x = collection_temp.trend, .desc = T)) %>%
select(species, "plast" = collection_temp.trend)
sp_means %>%
inner_join(sp_plast) %>%
mutate(species = fct_reorder(species, plast, .fun = min)) %>%
ggplot(aes(x = species, y = plast)) +
geom_hline(yintercept = 0) +
geom_bar(stat = "identity") +
theme_matt() +
theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = fecundity, y = site, fill = site)) +
geom_density_ridges(bandwidth = 2,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = size, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.02,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = ctmax, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.3,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "D", direction = -1) +
labs(x = "CTmax (°C)") +
theme_matt() +
theme(legend.position = "none")

LS0tCnRpdGxlOiBEaWFwdG9taWQgVGhlcm1hbCBMaW1pdHMKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIHRvYzogdHJ1ZQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1ULCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEYsIGVjaG8gPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IGtuaXRyOjppc19odG1sX291dHB1dCgpLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBkZXYgPSBjKCJwbmciLCAicGRmIiksCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFQKKQoKdGhlbWVfbWF0dCA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgZGFya190ZXh0ID0gImdyZXkyMCIpewogIG1pZF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbMl0KICBsaWdodF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbM10KICAKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gZGFya190ZXh0KSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBtaWRfdGV4dCksCiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDMsIDAsIDAsIDApLCAibW0iKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDAsIDUsIDAsIDApLCAibW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDkwKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjkpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSwiY20iKQogICAgKQp9Cgp0aGVtZV9tYXR0X2ZhY2V0cyA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtfdGV4dCA9ICJncmV5MjAiKXsKICBtaWRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzJdCiAgbGlnaHRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzNdCiAgCiAgdGhlbWVfYncoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMywgMCwgMCwgMCksICJtbSIpKSwKICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMCwgNSwgMCwgMCksICJtbSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTApLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPWJhc2Vfc2l6ZSAqIDAuOSksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMC45LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLAogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLjI1LCAwLjI1LCAwLjI1LCAwLjI1LCJjbSIpCiAgICApCn0KYGBgCgojIyBTaXRlIE1hcAoKYGBge3Igc2FtcGxlZC1zaXRlcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmNvb3JkcyA9IGN0bWF4X2RhdGEgJT4lCiAgaW5uZXJfam9pbihzaXRlX2RhdGEsIGJ5ID0gYygic2l0ZSIsICJsYXQiLCAiY29sbGVjdGlvbl90ZW1wIikpICU+JSAKICBkcGx5cjo6c2VsZWN0KHNpdGUsIGxvbmcsIGxhdCwgY29sbGVjdGlvbl90ZW1wLCBlbGV2YXRpb24pICU+JQogIGRyb3BfbmEoY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKQoKbWFwX2RhdGEoIndvcmxkIikgJT4lIAogIGZpbHRlcihyZWdpb24gJWluJSBjKCJVU0EiLCAiQ2FuYWRhIikpICU+JSAKICBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbihhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyZXk5MiIsIGNvbG91ciA9ICJncmV5NDAiLCBsaW5ld2lkdGggPSAwLjEpICsgCiAgY29vcmRfbWFwKHhsaW0gPSBjKC0xMTAsLTYwKSwKICAgICAgICAgICAgeWxpbSA9IGMoMjUsIDU1KSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjb29yZHMsCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLCB5ID0gbGF0LCBjb2xvdXIgPSBlbGV2YXRpb24pLAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKG9wdGlvbiA9ICJHIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsCiAgICAgICBjb2xvdXIgPSAiRWxldi4gKG0pIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCiMjIENUbWF4IERhdGEgCgpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTB9CnRlbXBfbGF0X3Bsb3QgPSBjdG1heF9kYXRhICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjb2xsZWN0aW9uX3RlbXApKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X3RlbXBfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2xhdF9wbG90ID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjdG1heCkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzcGVjaWVzKSwgCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2VsZXZfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcyksIAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBsYWJzKHggPSAiRWxldmF0aW9uIChtKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpnZ3B1YnI6OmdnYXJyYW5nZSh0ZW1wX2xhdF9wbG90LCBjdG1heF90ZW1wX3Bsb3QsIGN0bWF4X2xhdF9wbG90LCBjdG1heF9lbGV2X3Bsb3QsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBucm93ID0gMiwgbmNvbCA9IDIsIGxhYmVscyA9ICJBVVRPIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb2xsZWN0aW9uX3RlbXAsIHkgPSBjdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQpjdG1heF9kYXRhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gInNraXN0byIpIHwgCiAgICAgICAgICAgc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gImxlcHRvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAiYWdsYW8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl9kYXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBzdW1tYXJpc2UobWVhbl9jdG1heCA9IG1lYW4oY3RtYXgpLAogICAgICAgICAgICBjdG1heF9zZCA9IHNkKGN0bWF4KSwKICAgICAgICAgICAgY3RtYXhfbiA9IG4oKSwgCiAgICAgICAgICAgIGN0bWF4X3NlID0gY3RtYXhfc2QgLyBzcXJ0KGN0bWF4X24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RiwgbGluZXdpZHRoID0gMikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2N0bWF4IC0gY3RtYXhfc2UsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX2N0bWF4ICsgY3RtYXhfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IHNpemUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IGVnZ192b2x1bWUsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJFZ2cgVm9sdW1lIChtbV4zKSIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KY3RtYXhfZGF0YSAlPiUgCiAgc2VsZWN0KGVsZXZhdGlvbiwgY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY29sbGVjdGlvbl90ZW1wKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgbGFicyh4ID0gIkVsZXZhdGlvbiAobSkiLCAKICAgICAgIHkgPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gY3RtYXgsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoLn5zcGVjaWVzKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgbGFicyh4ID0gIkxlbmd0aCAobW0pIiwgCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHNpemUsIHkgPSBmZWN1bmRpdHksIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoLn5zcGVjaWVzKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgbGFicyh4ID0gIkxlbmd0aCAobW0pIiwgCiAgICAgICB5ID0gIkZlY3VuZGl0eSAoIyBlZ2dzKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3J9CmdncGxvdChjdG1heF9kYXRhLCBhZXMoeCA9IHNpemUsIHkgPSB0b3RhbF9lZ2dfdm9sdW1lKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IGV4cCh4KSkgKyAKICBnZW9tX3BvaW50KCkrCiAgbGFicyh4ID0gIlByb3NvbWUgTGVuZ3RoIChtbSkiLAogICAgICAgeSA9ICJUb3RhbCBFZ2cgVm9sdW1lIChtbV4zKSIpICsgCiAgdGhlbWVfbWF0dCgpCgpgYGAKCkRhdGEgZm9yIGp1c3QgKlNraXN0b2RpYXB0b211cyBwYWxsaWR1cyogaXMgc2hvd24gYmVsb3cuIFBvaW50IGNvbG9yIGlzIGFycmFuZ2VkIGFjY29yZGluZyB0byBsYXRpdHVkZS4gCmBgYHtyIGZpZy53aWR0aD04LjUsIGZpZy5oZWlnaHQ9NS41fQpjdG1heF9kYXRhICU+JSAKICBmaWx0ZXIoc3BlY2llcyA9PSAic2tpc3RvZGlhcHRvbXVzX3BhbGxpZHVzIikgJT4lCiAgbXV0YXRlKHNpdGUgPSBmY3RfcmVvcmRlcihzaXRlLCBsYXQsIC5kZXNjID0gVCkpICU+JSAKICAjIGdyb3VwX2J5KHNpdGUpICU+JSAKICAjIHN1bW1hcmlzZShzaXplID0gbWVhbihzaXplLCBuYS5ybSA9IFQpLCAKICAjICAgICAgICAgIHRvdGFsX2VnZ192b2x1bWUgPSBtZWFuKHRvdGFsX2VnZ192b2x1bWUsIG5hLnJtID0gVCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gdG90YWxfZWdnX3ZvbHVtZSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBleHAoeCksIAogICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc2l0ZSkpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChkaXJlY3Rpb24gPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIkQiKSArIAogIGxhYnMoeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiVG90YWwgRWdnIFZvbHVtZSAobW1eMykiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKCmBgYHtyfQptb2RlbF9kYXRhID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKCJnZW51cyIgPSBzdHJfc3BsaXRfZml4ZWQoc3BlY2llcywgcGF0dGVybiA9ICJfIiwgbiA9IDIpWywxXSwKICAgICAgICAgZ2VudXMgPSB0b29sczo6dG9UaXRsZUNhc2UoZ2VudXMpLAogICAgICAgICAiZG95IiA9IHlkYXkoY29sbGVjdGlvbl9kYXRlKSkgJT4lIAogIHNlbGVjdChzaXRlLCBjb2xsZWN0aW9uX2RhdGUsIGRveSwgY29sbGVjdGlvbl90ZW1wLCBsYXQsIGVsZXZhdGlvbiwgc3BlY2llcywgZ2VudXMsIHNhbXBsZV9pZCwgZmVjdW5kaXR5LCB0b3RhbF9lZ2dfdm9sdW1lLCBzaXplLCBjdG1heCkgJT4lIAogIGZpbHRlcihnZW51cyAhPSAiTUgiKSAlPiUgIAogIG11dGF0ZSh0b3RhbF9lZ2dfdm9sdW1lID0gaWZfZWxzZShpcy5uYSh0b3RhbF9lZ2dfdm9sdW1lKSwgMCwgdG90YWxfZWdnX3ZvbHVtZSksCiAgICAgICAgIGNvbGxlY3Rpb25fdGVtcF9zYyA9IHNjYWxlKGNvbGxlY3Rpb25fdGVtcCksCiAgICAgICAgIGxhdF9zYyA9IHNjYWxlKGxhdCksIAogICAgICAgICBlbGV2YXRpb25fc2MgPSBzY2FsZShlbGV2YXRpb24pLAogICAgICAgICB0ZXZfc2MgPSBzY2FsZSh0b3RhbF9lZ2dfdm9sdW1lKSkgCgpjdG1heF9vdmVyYWxsLm1vZGVsID0gbG0oZGF0YSA9IG1vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgY3RtYXggfiBnZW51cyArIGNvbGxlY3Rpb25fdGVtcCArIGxhdCArIGVsZXZhdGlvbiArIHRvdGFsX2VnZ192b2x1bWUpCgpkcm9wMShjdG1heF9vdmVyYWxsLm1vZGVsLCB0ZXN0ID0gIkYiKQoKI011TUluOjpkcmVkZ2UoY3RtYXhfdGVtcC5tb2RlbCkKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChjdG1heF9vdmVyYWxsLm1vZGVsKQoKc3VtbWFyeShjdG1heF9vdmVyYWxsLm1vZGVsKQoKZW1tZWFuczo6ZW1tZWFucyhjdG1heF9vdmVyYWxsLm1vZGVsLCBzcGVjcyA9ICJnZW51cyIpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIG11dGF0ZShnZW51cyA9IGZjdF9yZW9yZGVyKGdlbnVzLCAueCA9IGVtbWVhbiwgLmRlc2MgPSBUKSkgJT4lIAogIGdncGxvdChhZXMoZ2VudXMsIHkgPSBlbW1lYW4pKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVtbWVhbiAtIFNFLCB5bWF4ID0gZW1tZWFuICsgU0UpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBsaW5ld2lkdGggPSAxKSArIAogIGxhYnMoeCA9ICIiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKYGBgCgpgYGB7cn0KCmN0bWF4X3RlbXAubW9kZWwgPSBsbShkYXRhID0gbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICBjdG1heCB+IHNwZWNpZXMgKiBjb2xsZWN0aW9uX3RlbXApCgpkcm9wMShjdG1heF90ZW1wLm1vZGVsLCAKICAgICAgc2NvcGUgPSB+LiwKICAgICAgdGVzdCA9ICJGIikKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChjdG1heF90ZW1wLm1vZGVsKQoKc3BfbWVhbnMgPSBlbW1lYW5zOjplbW1lYW5zKGN0bWF4X3RlbXAubW9kZWwsICJzcGVjaWVzIikgJT4lIAogIGRhdGEuZnJhbWUoKSAlPiUgCiAgZHJvcF9uYSgpICU+JSAgCiAgc2VsZWN0KHNwZWNpZXMsICJjdG1heCIgPSBlbW1lYW4pCgpzcF9wbGFzdCA9IGVtbWVhbnM6OmVtdHJlbmRzKGN0bWF4X3RlbXAubW9kZWwsICJzcGVjaWVzIiwgdmFyID0gImNvbGxlY3Rpb25fdGVtcCIpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBmY3RfcmVvcmRlcihzcGVjaWVzLCAueCA9IGNvbGxlY3Rpb25fdGVtcC50cmVuZCwgLmRlc2MgPSBUKSkgJT4lIAogIHNlbGVjdChzcGVjaWVzLCAicGxhc3QiID0gY29sbGVjdGlvbl90ZW1wLnRyZW5kKQoKc3BfbWVhbnMgJT4lIAppbm5lcl9qb2luKHNwX3BsYXN0KSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBmY3RfcmVvcmRlcihzcGVjaWVzLCBwbGFzdCwgLmZ1biA9IG1pbikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzcGVjaWVzLCB5ID0gcGxhc3QpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQpgYGAKCgoKYGBge3IgZmVjdW5kaXR5LXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmZWN1bmRpdHksIHkgPSBzaXRlLCBmaWxsID0gc2l0ZSkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhiYW5kd2lkdGggPSAyLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBzaXplLXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gc2l0ZSwgZmlsbCA9IHNpdGUsIGdyb3VwID0gZ3JvdXBfaWQpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29sb3VyID0gImdyZXkzMCIsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC45LAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAwLjEsIHdpZHRoID0gMCkpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSkgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3IgY3RtYXgtcmlkZ2VzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoZ3JvdXBfaWQgPSBwYXN0ZShzaXRlLCBzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGN0bWF4LCB5ID0gc2l0ZSwgZmlsbCA9IHNpdGUsIGdyb3VwID0gZ3JvdXBfaWQpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMC4zLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xKSArIAogIGxhYnMoeCA9ICJDVG1heCAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIEhpZ2ggdGhyb3VnaHB1dCBzaXplIG1lYXN1cmVtZW50cyAKCgoKYGBge3J9CnNjYW5fc2l6ZXMgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIsIHN0YWdlID09ICJhZHVsdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsZW5ndGgsIGZpbGwgPSBzcGVjaWVzKSkgKyAKICBmYWNldF93cmFwKHNpdGV+LiwgbnJvdyA9IDMpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAxLCBjb2xvdXIgPSAiZ3JleTEwIiwgbGluZXdpZHRoID0gMC4yNSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDIwKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KCnNjYW5fc2l6ZXMgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIsIHN0YWdlID09ICJhZHVsdCIpICU+JQogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwgeSA9IHNpdGUsIGZpbGwgPSBzcGVjaWVzKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHlvZmZzZXQgPSAtMC4xNSwgd2lkdGggPSAwLCBoZWlnaHQgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjMsIHBvaW50X2NvbG91ciA9ICJncmV5MzAiKSAgKyAKICBsYWJzKHkgPSAiIiwKICAgICAgIHggPSAiUHJvc29tZSBMZW5ndGggKG1tKSIpICsgCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDIwKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKICAKYGBgCgoKIyMgQ09JIEJhcmNvZGluZyAKCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuLi9GaWd1cmVzL3NwZWNpZXNfcHJvcF9wbG90LnBuZyIpCmBgYAoKYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4uL0ZpZ3VyZXMvY2xhZGVfcHJvcF9wbG90LnBuZyIpCmBgYAoKYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4uL0ZpZ3VyZXMvdHJlZV9wbG90LnBuZyIpCmBgYAo=